All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.xmlbeans.impl.store.Xobj Maven / Gradle / Ivy

There is a newer version: 5.2.0
Show newest version
/*   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.apache.xmlbeans.impl.store;

import org.apache.xmlbeans.CDataBookmark;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.DOMException;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;
import org.w3c.dom.DOMImplementation;

// DOM Level 3
import org.w3c.dom.UserDataHandler;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.TypeInfo;


import javax.xml.transform.Source;

import java.io.PrintStream;

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

import org.apache.xmlbeans.impl.soap.Detail;
import org.apache.xmlbeans.impl.soap.DetailEntry;
import org.apache.xmlbeans.impl.soap.MimeHeaders;
import org.apache.xmlbeans.impl.soap.Name;
import org.apache.xmlbeans.impl.soap.SOAPBody;
import org.apache.xmlbeans.impl.soap.SOAPBodyElement;
import org.apache.xmlbeans.impl.soap.SOAPElement;
import org.apache.xmlbeans.impl.soap.SOAPEnvelope;
import org.apache.xmlbeans.impl.soap.SOAPException;
import org.apache.xmlbeans.impl.soap.SOAPFactory;
import org.apache.xmlbeans.impl.soap.SOAPFault;
import org.apache.xmlbeans.impl.soap.SOAPFaultElement;
import org.apache.xmlbeans.impl.soap.SOAPHeader;
import org.apache.xmlbeans.impl.soap.SOAPHeaderElement;
import org.apache.xmlbeans.impl.soap.SOAPPart;
import org.apache.xmlbeans.impl.store.Locale.LoadContext;

import org.apache.xmlbeans.impl.store.DomImpl.Dom;
import org.apache.xmlbeans.impl.store.DomImpl.CharNode;
import org.apache.xmlbeans.impl.store.DomImpl.TextNode;
import org.apache.xmlbeans.impl.store.DomImpl.CdataNode;
import org.apache.xmlbeans.impl.store.DomImpl.SaajTextNode;
import org.apache.xmlbeans.impl.store.DomImpl.SaajCdataNode;

import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.SchemaField;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlCursor.XmlMark;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.QNameSet;

import org.apache.xmlbeans.impl.values.TypeStore;
import org.apache.xmlbeans.impl.values.TypeStoreUser;
import org.apache.xmlbeans.impl.values.TypeStoreVisitor;
import org.apache.xmlbeans.impl.values.TypeStoreUserFactory;

import javax.xml.namespace.QName;

import org.apache.xmlbeans.impl.common.ValidatorListener;
import org.apache.xmlbeans.impl.common.XmlLocale;
import org.apache.xmlbeans.impl.common.QNameHelper;

abstract class Xobj implements TypeStore
{
    static final int TEXT     = Cur.TEXT;
    static final int ROOT     = Cur.ROOT;
    static final int ELEM     = Cur.ELEM;
    static final int ATTR     = Cur.ATTR;
    static final int COMMENT  = Cur.COMMENT;
    static final int PROCINST = Cur.PROCINST;

    static final int END_POS = Cur.END_POS;
    static final int NO_POS  = Cur.NO_POS;

    Xobj ( Locale l, int kind, int domType )
    {
        assert kind == ROOT || kind == ELEM || kind == ATTR || kind == COMMENT || kind == PROCINST;

        _locale = l;
        _bits = (domType << 4) + kind;
    }

    final boolean entered ( ) { return _locale.entered(); }

    final int kind    ( ) { return _bits & 0xF; }
    final int domType ( ) { return (_bits & 0xF0) >> 4; }

    final boolean isRoot      ( ) { return kind() == ROOT; }
    final boolean isAttr      ( ) { return kind() == ATTR; }
    final boolean isElem      ( ) { return kind() == ELEM; }
    final boolean isProcinst  ( ) { return kind() == PROCINST; }
    final boolean isComment   ( ) { return kind() == COMMENT; }
    final boolean isContainer ( ) { return Cur.kindIsContainer( kind() ); }
    final boolean isUserNode  ( ) { int k = kind(); return k == ELEM || k == ROOT || (k == ATTR && !isXmlns()); }

    final boolean isNormalAttr ( ) { return isAttr() && !Locale.isXmlns( _name ); }
    final boolean isXmlns      ( ) { return isAttr() &&  Locale.isXmlns( _name ); }

    final int cchValue ( ) { return _cchValue; }
    final int cchAfter ( ) { return _cchAfter; }

    final int posAfter ( ) { return 2 + _cchValue; }
    final int posMax   ( ) { return 2 + _cchValue + _cchAfter; }

    final String getXmlnsPrefix ( ) { return Locale.xmlnsPrefix( _name ); }
    final String getXmlnsUri    ( ) { return getValueAsString(); }

    final boolean hasTextEnsureOccupancy ( )
    {
        ensureOccupancy();
        return hasTextNoEnsureOccupancy();
    }

    final boolean hasTextNoEnsureOccupancy ( )
    {
        if (_cchValue > 0)
            return true;

        Xobj lastAttr = lastAttr();

        return lastAttr != null && lastAttr._cchAfter > 0;
    }

    final boolean hasAttrs    ( ) { return _firstChild != null &&  _firstChild.isAttr(); }
    final boolean hasChildren ( ) { return _lastChild  != null && !_lastChild .isAttr(); }


    /**
     * this method is to speed up DomImpl
     * when underlying obj is an Xobj
     *
     * @return 0 or 1 dom children; val 2 indicates that DomImpl needs to
     *         compute the result itself
     */
    final protected int getDomZeroOneChildren()
    {
        if (_firstChild == null &&
            _srcValue == null &&
            _charNodesValue == null)
            return 0;

        if (_lastChild != null &&
            _lastChild.isAttr() &&
            _lastChild._charNodesAfter == null &&
            _lastChild._srcAfter == null &&
            _srcValue == null &&
            _charNodesValue == null
        )
            return 0;

        if (_firstChild == _lastChild &&
            _firstChild != null &&
            !_firstChild.isAttr() &&
            _srcValue == null &&
            _charNodesValue == null &&
            _firstChild._srcAfter == null
        )
            return 1;

        if (_firstChild == null &&
            _srcValue != null &&
           ( _charNodesValue == null ||
            (_charNodesValue._next == null &&
            _charNodesValue._cch == _cchValue))
        )
            return 1;
        //single elem after an attr
        Xobj lastAttr = lastAttr();
        Xobj node = lastAttr == null ?
            null : lastAttr._nextSibling;
        if (lastAttr != null &&
            lastAttr._srcAfter == null &&
            node != null &&
            node._srcAfter == null &&
            node._nextSibling == null)
            return 1;

        return 2;
    }

    /**
     * can one use the _firstChild pointer to retrieve
     * the first DOM child
     *
     * @return
     */
    final protected boolean isFirstChildPtrDomUsable()
    {
        if (_firstChild == null &&
            _srcValue == null &&
            _charNodesValue == null)
            return true;

        if (_firstChild != null &&
            !_firstChild.isAttr() &&
            _srcValue == null &&
            _charNodesValue == null)
        {
            assert (_firstChild instanceof Xobj.NodeXobj):
                "wrong node type";
            return true;
        }
        return false;
    }

    /**
     * can one use the _nextSibling pointer to retrieve
     *  the next DOM sibling
     * @return
     */
    final protected boolean isNextSiblingPtrDomUsable()
    {
        if (_charNodesAfter == null &&
            _srcAfter == null)
        {
            assert (_nextSibling == null ||
                _nextSibling instanceof Xobj.NodeXobj):
                "wrong node type";
            return true;
        }
        return false;
    }
    /**
     * can one use the _charNodesValue pointer to retrieve
     * the next DOM sibling
     *
     * @return
     */
    final protected boolean isExistingCharNodesValueUsable()
    {
        if (_srcValue == null) return false;
        if (_charNodesValue != null && _charNodesValue._next == null
            && _charNodesValue._cch == _cchValue)
            return true;
       return false;
    }
      final protected boolean isCharNodesValueUsable()
      {
          return isExistingCharNodesValueUsable() ||
              (_charNodesValue =
              Cur.updateCharNodes(_locale, this,
                  _charNodesValue, _cchValue)) != null;
      }

    /**
     * can one use the _charNodesAfter pointer to retrieve
     * the next DOM sibling
     *
     * @return
     */
    final protected boolean isCharNodesAfterUsable()
    {
        if (_srcAfter == null) return false;
        if (_charNodesAfter != null && _charNodesAfter._next == null
            && _charNodesAfter._cch == this._cchAfter)
            return true;
        return (_charNodesAfter =
            Cur.updateCharNodes(_locale, this,
                _charNodesAfter, _cchAfter)) != null;
    }


    final Xobj lastAttr ( )
    {
        if (_firstChild == null || !_firstChild.isAttr())
            return null;

        Xobj lastAttr = _firstChild;

        while ( lastAttr._nextSibling != null && lastAttr._nextSibling.isAttr() )
            lastAttr = lastAttr._nextSibling;

        return lastAttr;
    }

    abstract Dom getDom ( );

    abstract Xobj newNode ( Locale l );

    final int cchLeft ( int p )
    {
        if (isRoot() && p == 0)
            return 0;

        Xobj x = getDenormal( p );

        p = posTemp();
        int pa = x.posAfter();

        return p - (p < pa ? 1 : pa);
    }

    final int cchRight ( int p )
    {
        assert p < posMax();

        if (p <= 0)
            return 0;

        int pa = posAfter();

        return p < pa ? pa - p - 1 : posMax() - p;
    }

    //
    // Dom interface
    //

    public final Locale locale   ( ) { return _locale;   }
    public final int    nodeType ( ) { return domType(); }
    public final QName  getQName ( ) { return _name;     }

    public final Cur tempCur ( ) { Cur c = _locale.tempCur(); c.moveTo( this ); return c; }

    public void dump ( PrintStream o, Object ref ) { Cur.dump( o, (Xobj) this, ref ); }
    public void dump ( PrintStream o ) { Cur.dump( o, this, this ); }
    public void dump ( ) { dump( System.out ); }

    //
    //
    //

    final Cur getEmbedded ( )
    {
        _locale.embedCurs();

        return _embedded;
    }

    // Incoming p must be at text (implicitly denormalized)

    final boolean inChars ( int p, Xobj xIn, int pIn, int cch, boolean includeEnd )
    {
        assert p > 0 && p < posMax() && p != posAfter() - 1 && cch > 0;
        assert xIn.isNormal( pIn );

        // No need to denormalize "in" if the right hand side is excluded.  Denormalizing deals
        // with the case where p is END_POS.

        int offset;

        if (includeEnd)
        {
            // Can't denormalize at the beginning of the document

            if (xIn.isRoot() && pIn == 0)
                return false;

            xIn = xIn.getDenormal( pIn );
            pIn = xIn.posTemp();

            offset = 1;
        }
        else
            offset = 0;

        return xIn == this && pIn >= p && pIn < p + (cch < 0 ? cchRight( p ) : cch) + offset;
    }

    // Is x/p just after the end of this

    final boolean isJustAfterEnd ( Xobj x, int p )
    {
        assert x.isNormal( p );

        // Get denormalize at the beginning of the doc

        if (x.isRoot() && p == 0)
            return false;

        return
            x == this
                ? p == posAfter()
                : x.getDenormal( p ) == this && x.posTemp() == posAfter();
    }

    final boolean isInSameTree ( Xobj x )
    {
        if (_locale != x._locale)
            return false;

        for ( Xobj y = this ; ; y = y._parent )
        {
            if (y == x)
                return true;

            if (y._parent == null)
            {
                for ( ; ; x = x._parent )
                {
                    if (x == this)
                        return true;

                    if (x._parent == null)
                        return x == y;
                }
            }
        }
    }

    final boolean contains ( Cur c )
    {
        assert c.isNormal();

        return contains( c._xobj, c._pos );
    }

    final boolean contains ( Xobj x, int p )
    {
        assert x.isNormal( p );

        if (this == x)
            return p == END_POS || (p > 0 && p < posAfter());

        if (_firstChild == null)
            return false;

        for ( ; x != null ; x = x._parent )
            if (x == this)
                return true;

        return false;
    }

    final Bookmark setBookmark ( int p, Object key, Object value )
    {
        assert isNormal( p );

        for ( Bookmark b = _bookmarks ; b != null ; b = b._next )
        {
            if (p == b._pos && key == b._key)
            {
                if (value == null)
                {
                    _bookmarks = b.listRemove( _bookmarks );
                    return null;
                }

                b._value = value;

                return b;
            }
        }

        if (value == null)
            return null;

        Bookmark b = new Bookmark();

        b._xobj  = this;
        b._pos   = p;
        b._key   = key;
        b._value = value;

        _bookmarks = b.listInsert( _bookmarks );

        return b;
    }

    final boolean hasBookmark(Object key, int pos)
    {
        for ( Bookmark b = _bookmarks ; b != null ; b = b._next )
            if ( b._pos == pos && key == b._key )
            {
                //System.out.println("hasCDataBookmark  pos: " + pos + " xobj: " + getQName() + " b._pos: " + _bookmarks._pos);
                return true;
            }

        return false;
    }

    final Xobj findXmlnsForPrefix ( String prefix )
    {
        assert isContainer() && prefix != null;

        for ( Xobj c = this ; c != null ; c = c._parent )
            for ( Xobj a = c.firstAttr() ; a != null ; a = a.nextAttr() )
                if (a.isXmlns() && a.getXmlnsPrefix().equals( prefix ))
                    return a;

        return null;
    }

    final boolean removeAttr ( QName name )
    {
        assert isContainer();

        Xobj a = getAttr( name );

        if (a == null)
            return false;

        Cur c = a.tempCur();

        for ( ; ; )
        {
            c.moveNode( null );

            a = getAttr( name );

            if (a == null)
                break;

            c.moveTo( a );
        }

        c.release();

        return true;
    }

    final Xobj setAttr ( QName name, String value )
    {
        assert isContainer();

        Cur c = tempCur();

        if (c.toAttr( name ))
            c.removeFollowingAttrs();
        else
        {
            c.next();
            c.createAttr( name );
        }

        c.setValue( value );

        Xobj a = c._xobj;

        c.release();

        return a;
    }

    final void setName ( QName newName )
    {
        assert isAttr() || isElem() || isProcinst();
        assert newName != null;

        if (!_name.equals( newName ) || !_name.getPrefix().equals( newName.getPrefix() ))
        {
// TODO - this is not a structural change .... perhaps should not issue a change here?
            _locale.notifyChange();

            QName oldName = _name;

            _name = newName;
            if (this instanceof Xobj.NamedNodeXobj)
            {
                NamedNodeXobj me = (NamedNodeXobj)this;
                me._canHavePrefixUri = true;
            }

            if (!isProcinst())
            {
                Xobj disconnectFromHere = this;

                if (isAttr() && _parent != null)
                {
                    if (oldName.equals( Locale._xsiType ) || newName.equals( Locale._xsiType ))
                        disconnectFromHere = _parent;

                    if (oldName.equals( Locale._xsiNil ) || newName.equals( Locale._xsiNil ))
                        _parent.invalidateNil();
                }

                disconnectFromHere.disconnectNonRootUsers();
            }

            _locale._versionAll++;
            _locale._versionSansText++;
        }
    }

    final Xobj ensureParent ( )
    {
        assert _parent != null || (!isRoot() && cchAfter() == 0);
        return _parent == null ? new DocumentFragXobj( _locale ).appendXobj( this ) : _parent;
    }

    final Xobj firstAttr ( )
    {
        return _firstChild == null || !_firstChild.isAttr() ? null : _firstChild;
    }

    final Xobj nextAttr ( )
    {
        if (_firstChild != null && _firstChild.isAttr())
            return _firstChild;

        if (_nextSibling != null && _nextSibling.isAttr())
            return _nextSibling;

        return null;
    }

    final boolean isValid ( )
    {
        if (isVacant() && (_cchValue != 0 || _user == null))
            return false;

        return true;
    }

    final int posTemp ( )
    {
        return _locale._posTemp;
    }

    final Xobj getNormal ( int p )
    {
        assert p == END_POS || (p >= 0 && p <= posMax());

        Xobj x = this;

        if (p == x.posMax())
        {
            if (x._nextSibling != null)
            {
                x = x._nextSibling;
                p = 0;
            }
            else
            {
                x = x.ensureParent();
                p = END_POS;
            }
        }
        else if (p == x.posAfter() - 1)
            p = END_POS;

        _locale._posTemp = p;

        return x;
    }

    // Can't denormalize a position at the very beginning of the document.  No where to go to the
    // left!

    final Xobj getDenormal ( int p )
    {
        assert END_POS == -1;
        assert !isRoot() || p == END_POS || p > 0;

        Xobj x = this;

        if (p == 0)
        {
            if (x._prevSibling == null)
            {
                x = x.ensureParent();
                p = x.posAfter() - 1;
            }
            else
            {
                x = x._prevSibling;
                p = x.posMax();
            }
        }
        else if (p == END_POS)
        {
            if (x._lastChild == null)
                p = x.posAfter() - 1;
            else
            {
                x = x._lastChild;
                p = x.posMax();
            }
        }

        _locale._posTemp = p;

        return x;
    }

    final boolean isNormal ( int p )
    {
        if (!isValid())
            return false;

        if (p == END_POS || p == 0)
            return true;

        if (p < 0 || p >= posMax())
            return false;

        if (p >= posAfter())
        {
            if (isRoot())
                return false;

            if (_nextSibling != null && _nextSibling.isAttr())
                return false;

            if (_parent == null || !_parent.isContainer())
                return false;
        }

        if (p == posAfter() - 1)
            return false;

        return true;
    }

    final Xobj walk ( Xobj root, boolean walkChildren )
    {
        if (_firstChild != null && walkChildren)
            return _firstChild;

        for ( Xobj x = this ; x != root ; x = x._parent )
            if (x._nextSibling != null)
                return x._nextSibling;

        return null;
    }

    final Xobj removeXobj ( )
    {
        if (_parent != null)
        {
            if (_parent._firstChild == this)
                _parent._firstChild = _nextSibling;

            if (_parent._lastChild == this)
                _parent._lastChild = _prevSibling;

            if (_prevSibling != null)
                _prevSibling._nextSibling = _nextSibling;

            if (_nextSibling != null)
                _nextSibling._prevSibling = _prevSibling;

            _parent = null;
            _prevSibling = null;
            _nextSibling = null;
        }

        return this;
    }

    final Xobj insertXobj ( Xobj s )
    {
        assert _locale == s._locale;
        assert !s.isRoot() && !isRoot();
        assert s._parent == null;
        assert s._prevSibling == null;
        assert s._nextSibling == null;

        ensureParent();

        s._parent = _parent;
        s._prevSibling = _prevSibling;
        s._nextSibling = this;

        if (_prevSibling != null)
            _prevSibling._nextSibling = s;
        else
            _parent._firstChild = s;

        _prevSibling = s;

        return this;
    }

    final Xobj appendXobj ( Xobj c )
    {
        assert _locale == c._locale;
        assert !c.isRoot();
        assert c._parent == null;
        assert c._prevSibling == null;
        assert c._nextSibling == null;
        assert _lastChild == null || _firstChild != null;

        c._parent = this;
        c._prevSibling = _lastChild;

        if (_lastChild == null)
            _firstChild = c;
        else
            _lastChild._nextSibling = c;

        _lastChild = c;

        return this;
    }

    final void removeXobjs ( Xobj first, Xobj last )
    {
        assert last._locale == first._locale;
        assert first._parent == this;
        assert last._parent == this;

        if (_firstChild == first)
            _firstChild = last._nextSibling;

        if (_lastChild == last)
            _lastChild = first._prevSibling;

        if (first._prevSibling != null)
            first._prevSibling._nextSibling = last._nextSibling;

        if (last._nextSibling != null)
            last._nextSibling._prevSibling = first._prevSibling;

        // Leave the children linked together

        first._prevSibling = null;
        last._nextSibling = null;

        for ( ; first != null ; first = first._nextSibling )
            first._parent = null;
    }

    final void insertXobjs ( Xobj first, Xobj last )
    {
        assert _locale == first._locale;
        assert last._locale == first._locale;
        assert first._parent == null && last._parent == null;
        assert first._prevSibling == null;
        assert last._nextSibling == null;

        first._prevSibling = _prevSibling;
        last._nextSibling = this;

        if (_prevSibling != null)
            _prevSibling._nextSibling = first;
        else
            _parent._firstChild = first;

        _prevSibling = last;

        for ( ; first != this ; first = first._nextSibling )
            first._parent = _parent;
    }

    final void appendXobjs ( Xobj first, Xobj last )
    {
        assert _locale == first._locale;
        assert last._locale == first._locale;
        assert first._parent == null && last._parent == null;
        assert first._prevSibling == null;
        assert last._nextSibling == null;
        assert !first.isRoot();

        first._prevSibling = _lastChild;

        if (_lastChild == null)
            _firstChild = first;
        else
            _lastChild._nextSibling = first;

        _lastChild = last;

        for ( ; first != null ; first = first._nextSibling )
            first._parent = this;
    }

    static final void disbandXobjs ( Xobj first, Xobj last )
    {
        assert last._locale == first._locale;
        assert first._parent == null && last._parent == null;
        assert first._prevSibling == null;
        assert last._nextSibling == null;
        assert !first.isRoot();

        while ( first != null )
        {
            Xobj next = first._nextSibling;
            first._nextSibling = first._prevSibling = null;
            first = next;
        }
    }

    // Potential attr is going to be moved/removed, invalidate parent if it is a special attr

    final void invalidateSpecialAttr ( Xobj newParent )
    {
        if (isAttr())
        {
            if (_name.equals( Locale._xsiType ))
            {
                if (_parent != null)
                    _parent.disconnectNonRootUsers();

                if (newParent != null)
                    newParent.disconnectNonRootUsers();
            }

            if (_name.equals( Locale._xsiNil ))
            {
                if (_parent != null)
                    _parent.invalidateNil();

                if (newParent != null)
                    newParent.invalidateNil();
            }
        }
    }

    // Move or remove chars.  Incoming p is denormalized.  Incoming xTo and pTo are denormalized.
    // Option to move curs with text.  Option to perform invalidations.
    //
    // Important note: this fcn must operate under the assumption that the tree may be in an
    // invalid state.  Most likely, there may be text on two different nodes which should belong
    // on the same node.  Assertion of cursor normalization usually detects this problem.  Any of
    // the fcns it calls must also deal with these invalid conditions.  Try not to call so many
    // fcns from here.

    final void removeCharsHelper (
        int p, int cchRemove, Xobj xTo, int pTo, boolean moveCurs, boolean invalidate )
    {
        assert p > 0 && p < posMax() && p != posAfter() - 1;
        assert cchRemove > 0;
        assert cchRight( p ) >= cchRemove;
        assert !moveCurs || xTo != null;

        // Here I check the span of text to be removed for cursors.  If xTo/pTo is not specified,
        // then the caller wants these cursors to collapse to be after the text being removed.  If
        // the caller specifies moveCurs, then the caller has arranged for the text being removed
        // to have been copied to xTp/pTo and wants the cursors to be moved there as well.
        // Note that I call nextChars here.  I do this because trying to shift the cursor to the
        // end of the text to be removed with a moveTo could cause the improper placement of the
        // cursor just before an end tag, instead of placing it just before the first child.  Also,
        // I adjust all positions of curs after the text to be removed to account for the removal.

        for ( Cur c = getEmbedded() ; c != null ; )
        {
            Cur next = c._next;

            // Here I test to see if the Cur c is in the range of chars to be removed.  Normally
            // I would call inChars, but it can't handle the invalidity of the tree, so I heve
            // inlined the inChars logic here (includeEnd is false, makes it much simpler).
            // Note that I also call moveToNoCheck because the destination may have afterText
            // and no parent which will cause normaliztion checks in MoveTo to fail.  I don't think
            // that nextChars will be called under such circumstnaces.

            assert c._xobj == this;

            if (c._pos >= p && c._pos < p + cchRemove)
            {
                if (moveCurs)
                    c.moveToNoCheck( xTo, pTo + c._pos - p );
                else
                    c.nextChars( cchRemove - c._pos + p );
            }

            // If c is still on this Xobj and it's to the right of the chars to remove, adjust
            // it to adapt to the removal of the cars.  I don't have to worry about END_POS
            // here, just curs in text.

            if (c._xobj == this && c._pos >= p + cchRemove)
                c._pos -= cchRemove;

            c = next;
        }

        // Here I move bookmarks in this text to the span of text at xTo/pTo.  The text at this/p
        // is going away, but a caller of this fcn who specifies xTo/pTo has copied the text to
        // xTo/pTo.  The caller has to make sure that if xTo/pTo is not specified, then there are
        // no bookmarks in the span of text to be removed.

        for ( Bookmark b = _bookmarks ; b != null ; )
        {
            Bookmark next = b._next;

            // Similarly, as above, I can't call inChars here

            assert b._xobj == this;

            if (b._pos >= p && b._pos < p + cchRemove)
            {
                assert xTo != null;
                b.moveTo( xTo, pTo + b._pos - p );
            }

            if (b._xobj == this && b._pos >= p + cchRemove)
                b._pos -= cchRemove;

            b = b._next;
        }

        // Now, remove the actual chars

        int pa = posAfter();
        CharUtil cu = _locale.getCharUtil();

        if (p < pa)
        {
            _srcValue = cu.removeChars( p - 1, cchRemove, _srcValue, _offValue, _cchValue );
            _offValue = cu._offSrc;
            _cchValue = cu._cchSrc;

            if (invalidate)
            {
                invalidateUser();
                invalidateSpecialAttr( null );
            }
        }
        else
        {
            _srcAfter = cu.removeChars( p - pa, cchRemove, _srcAfter, _offAfter, _cchAfter );
            _offAfter = cu._offSrc;
            _cchAfter = cu._cchSrc;

            if (invalidate && _parent != null)
                _parent.invalidateUser();
        }
    }

    // Insert chars into this xobj.  Incoming p is denormalized.  Update bookmarks and cursors.
    // This fcn does not deal with occupation of the value, this needs to be handled by the
    // caller.

    final void insertCharsHelper ( int p, Object src, int off, int cch, boolean invalidate )
    {
        assert p > 0;
        assert p >= posAfter() || isOccupied();

        int pa = posAfter();

        // Here I shuffle bookmarks and cursors affected by the insertion of the new text.  Because
        // getting the embedded cursors is non-trivial, I avoid getting them if I don't need to.
        // Basically, I need to know if p is before any text in the node as a whole.  If it is,
        // then there may be cursors/marks I need to shift right.

        if (p - (p < pa ? 1 : 2) < _cchValue + _cchAfter)
        {
            for ( Cur c = getEmbedded() ; c != null ; c = c._next )
                if (c._pos >= p)
                    c._pos += cch;

            for ( Bookmark b = _bookmarks ; b != null ; b = b._next )
                if (b._pos >= p)
                    b._pos += cch;
        }

        // Now, stuff the new characters in!  Also invalidate the proper container and if the
        // value of an attribute is changing, check for special attr invalidation.  Note that
        // I do not assume that inserting after text will have a parent.  There are use cases
        // from moveNodesContents which excersize this.

        CharUtil cu = _locale.getCharUtil();

        if (p < pa)
        {
            _srcValue = cu.insertChars( p - 1, _srcValue, _offValue, _cchValue, src, off, cch );
            _offValue = cu._offSrc;
            _cchValue = cu._cchSrc;

            if (invalidate)
            {
                invalidateUser();
                invalidateSpecialAttr( null );
            }
        }
        else
        {
            _srcAfter = cu.insertChars( p - pa, _srcAfter, _offAfter, _cchAfter, src, off, cch );
            _offAfter = cu._offSrc;
            _cchAfter = cu._cchSrc;

            if (invalidate && _parent != null)
                _parent.invalidateUser();
        }
    }

    Xobj copyNode ( Locale toLocale )
    {
        Xobj newParent = null;
        Xobj copy = null;

        for ( Xobj x = this ; ; )
        {
            x.ensureOccupancy();

            Xobj newX = x.newNode( toLocale );

            newX._srcValue = x._srcValue;
            newX._offValue = x._offValue;
            newX._cchValue = x._cchValue;

            newX._srcAfter = x._srcAfter;
            newX._offAfter = x._offAfter;
            newX._cchAfter = x._cchAfter;

            for ( Bookmark b = x._bookmarks; b != null ; b = b._next )
            {
               if ( x.hasBookmark( CDataBookmark.CDATA_BOOKMARK.getKey(), b._pos) )
                   newX.setBookmark(b._pos, CDataBookmark.CDATA_BOOKMARK.getKey(), CDataBookmark.CDATA_BOOKMARK);
            }
            // TODO - strange to have charNode stuff inside here .....
           // newX._charNodesValue = CharNode.copyNodes( x._charNodesValue, newX._srcValue );
           // newX._charNodesAfter = CharNode.copyNodes( x._charNodesAfter, newX._srcAfter );

            if (newParent == null)
                copy = newX;
            else
                newParent.appendXobj( newX );

            // Walk to the next in-order xobj.  Record the current (y) to compute newParent

            Xobj y = x;

            if ((x = x.walk( this, true )) == null)
                break;

            if (y == x._parent)
                newParent = newX;
            else
                for ( ; y._parent != x._parent ; y = y._parent )
                    newParent = newParent._parent;
        }

        copy._srcAfter = null;
        copy._offAfter = 0;
        copy._cchAfter = 0;

        return copy;
    }

    // Rturns all the chars, even if there is text intermixed with children

    String getCharsAsString ( int p, int cch, int wsr )
    {
        if (cchRight( p ) == 0)
            return "";

        Object src = getChars( p, cch );

        if (wsr == Locale.WS_PRESERVE)
            return CharUtil.getString( src, _locale._offSrc, _locale._cchSrc );

        Locale.ScrubBuffer scrub = Locale.getScrubBuffer( wsr );

        scrub.scrub( src, _locale._offSrc, _locale._cchSrc );

        return scrub.getResultAsString();
    }
    String getCharsAfterAsString ( int off, int cch )
    {
       int offset = off + _cchValue + 2;
        if (offset == posMax())
            offset = -1;
        return getCharsAsString(offset, cch,
            Locale.WS_PRESERVE);
    }
    String getCharsValueAsString ( int off, int cch )
    {
       return getCharsAsString(off + 1, cch,
                        Locale.WS_PRESERVE);
    }
    String getValueAsString ( int wsr )
    {
        if (!hasChildren())
        {
            Object src = getFirstChars();

            if (wsr == Locale.WS_PRESERVE)
            {
                String s = CharUtil.getString( src, _locale._offSrc, _locale._cchSrc );

                // Cache string to be able to use it later again

                int cch = s.length();

                if (cch > 0)
                {
                    Xobj lastAttr = lastAttr();

                    assert (lastAttr == null ? _cchValue : lastAttr._cchAfter) == cch;

                    if (lastAttr != null)
                    {
                        lastAttr._srcAfter = s;
                        lastAttr._offAfter = 0;
                    }
                    else
                    {
                        _srcValue = s;
                        _offValue = 0;
                    }
                }

                return s;
            }

            Locale.ScrubBuffer scrub = Locale.getScrubBuffer( wsr );

            scrub.scrub( src, _locale._offSrc, _locale._cchSrc );

            return scrub.getResultAsString();
        }

        Locale.ScrubBuffer scrub = Locale.getScrubBuffer( wsr );

        Cur c = tempCur();

        c.push();

        for ( c.next() ; !c.isAtEndOfLastPush() ; )
        {
            if (c.isText())
                scrub.scrub( c.getChars( -1 ), c._offSrc, c._cchSrc );

            if (c.isComment() || c.isProcinst())
                c.skip();
            else
                c.next();
        }

        String s = scrub.getResultAsString();

        c.release();

        return s;
    }

    String getValueAsString ( )
    {
        return getValueAsString( Locale.WS_PRESERVE );
    }

    String getString ( int p, int cch )
    {
        int cchRight = cchRight( p );

        if (cchRight == 0)
            return "";

        if (cch < 0 || cch > cchRight)
            cch = cchRight;

        int pa = posAfter();

        assert p > 0;

        String s;

        if (p >= pa)
        {
            s = CharUtil.getString( _srcAfter, _offAfter + p - pa, cch );

            if (p == pa && cch == _cchAfter)
            {
                _srcAfter = s;
                _offAfter = 0;
            }
        }
        else
        {
            s = CharUtil.getString( _srcValue, _offValue + p - 1, cch );

            if (p == 1 && cch == _cchValue)
            {
                _srcValue = s;
                _offValue = 0;
            }
        }

        return s;
    }

    // Returns just chars just after the begin tag ... does not get all the text if there are
    // children

    Object getFirstChars ( )
    {
        ensureOccupancy();

        if (_cchValue > 0)
            return getChars( 1, -1 );

        Xobj lastAttr = lastAttr();

        if (lastAttr == null || lastAttr._cchAfter <= 0)
        {
            _locale._offSrc = 0;
            _locale._cchSrc = 0;

            return null;
        }

        return lastAttr.getChars( lastAttr.posAfter(), -1 );
    }

    Object getChars ( int pos, int cch, Cur c )
    {
        Object src = getChars( pos, cch );

        c._offSrc = _locale._offSrc;
        c._cchSrc = _locale._cchSrc;

        return src;
    }

    // These return the remainder of the char triple that getChars starts

    Object getChars ( int pos, int cch )
    {
        assert isNormal( pos );

        int cchRight = cchRight( pos );

        if (cch < 0 || cch > cchRight)
            cch = cchRight;

        if (cch == 0)
        {
            _locale._offSrc = 0;
            _locale._cchSrc = 0;

            return null;
        }

        return getCharsHelper( pos, cch );
    }

    // Assumes that there are chars to return, does not assume normal x/p

    Object getCharsHelper ( int pos, int cch )
    {
        assert cch > 0 && cchRight( pos ) >= cch;

        int pa = posAfter();

        Object src;

        if (pos >= pa)
        {
            src = _srcAfter;
            _locale._offSrc = _offAfter + pos - pa;
        }
        else
        {
            src = _srcValue;
            _locale._offSrc = _offValue + pos - 1;
        }

        _locale._cchSrc = cch;

        return src;
    }

    //
    //
    //

    final void setBit     ( int mask ) { _bits |=  mask; }
    final void clearBit   ( int mask ) { _bits &= ~mask; }

    final boolean bitIsSet   ( int mask ) { return (_bits & mask) != 0; }
    final boolean bitIsClear ( int mask ) { return (_bits & mask) == 0; }

    static final int VACANT             = 0x100;
    static final int STABLE_USER        = 0x200;
    static final int INHIBIT_DISCONNECT = 0x400;

    final boolean isVacant          ( ) { return bitIsSet   ( VACANT ); }
    final boolean isOccupied        ( ) { return bitIsClear ( VACANT ); }
    final boolean inhibitDisconnect ( ) { return bitIsSet   ( INHIBIT_DISCONNECT ); }

    final boolean isStableUser    ( ) { return bitIsSet( STABLE_USER ); }

    void invalidateNil ( )
    {
        if (_user != null)
            _user.invalidate_nilvalue();
    }

    void setStableType ( SchemaType type )
    {
        setStableUser( ((TypeStoreUserFactory) type).createTypeStoreUser() );
    }

    void setStableUser ( TypeStoreUser user )
    {
        disconnectNonRootUsers();
        disconnectUser();

        assert _user == null;

        _user = user;

        _user.attach_store( this );

        setBit( STABLE_USER );
    }

    void disconnectUser ( )
    {
        if (_user != null && !inhibitDisconnect())
        {
            ensureOccupancy();
            _user.disconnect_store();
            _user = null;
        }
    }

    // If a node does not have a user, then I don't need to walk its descendents.  NOte that
    // the doconnect happens in document order.  This may be a problem ... not sure ... May want
    // to disconnect in a bottom up manner.

    void disconnectNonRootUsers ( )
    {
        Xobj next;

        for ( Xobj x = this ; x != null ; x = next )
        {
            next = x.walk( this, x._user != null );

            if (!x.isRoot())
                x.disconnectUser();
        }
    }

    void disconnectChildrenUsers ( )
    {
        Xobj next;

        for ( Xobj x = walk( this, _user == null ) ; x != null ; x = next )
        {
            next = x.walk( this, x._user != null );

            x.disconnectUser();
        }
    }

    /**
     * Given a prefix, returns the namespace corresponding to
     * the prefix at this location, or null if there is no mapping
     * for this prefix.
     * 

* prefix="" indicates the absence of a prefix. A return value * of "" indicates the no-namespace, and should not be confused * with a return value of null, which indicates an illegal * state, where there is no mapping for the given prefix. *

* If the the default namespace is not explicitly mapped in the xml, * the xml spec says that it should be mapped to the no-namespace. * When the 'defaultAlwaysMapped' parameter is true, the default namepsace * will return the no-namespace even if it is not explicity * mapped, otherwise the default namespace will return null. *

* This function intercepts the built-in prefixes "xml" and * "xmlns" and returns their well-known namespace URIs. * * @param prefix The prefix to look up. * @param defaultAlwaysMapped If true, return the no-namespace for the default namespace if not set. * @return The mapped namespace URI ("" if no-namespace), or null if no mapping. */ final String namespaceForPrefix ( String prefix, boolean defaultAlwaysMapped ) { if (prefix == null) prefix = ""; // handle built-in prefixes if (prefix.equals( "xml" )) return Locale._xml1998Uri; if (prefix.equals( "xmlns" )) return Locale._xmlnsUri; for ( Xobj x = this ; x != null ; x = x._parent ) for ( Xobj a = x._firstChild ; a != null && a.isAttr() ; a = a._nextSibling ) if (a.isXmlns() && a.getXmlnsPrefix().equals( prefix )) return a.getXmlnsUri(); return defaultAlwaysMapped && prefix.length() == 0 ? "" : null; } final String prefixForNamespace ( String ns, String suggestion, boolean createIfMissing ) { if (ns == null) ns = ""; // special cases if (ns.equals( Locale._xml1998Uri )) return "xml"; if (ns.equals( Locale._xmlnsUri )) return "xmlns"; // Get the closest container for the spot we're on Xobj base = this; while ( !base.isContainer() ) base = base.ensureParent(); // Special handling for the no-namespace case if (ns.length() == 0) { // Search for a namespace decl which defines the default namespace Xobj a = base.findXmlnsForPrefix( "" ); // If I did not find a default decl or the decl maps to the no namespace, then // the default namespace is mapped to "" if (a == null || a.getXmlnsUri().length() == 0) return ""; // At this point, I've found a default namespace which is *not* the no-namespace. // If I can't modify the document to mape the desired no-namespace, I must fail. if (!createIfMissing) return null; // Ok, I need to make the default namespace on the nearest container map to "" base.setAttr( _locale.createXmlns( null ), "" ); return ""; } // Look for an exisiting mapping for the desired uri which has a visible prefix for ( Xobj c = base ; c != null ; c = c._parent ) for ( Xobj a = c.firstAttr() ; a != null ; a = a.nextAttr() ) if (a.isXmlns() && a.getXmlnsUri().equals( ns )) if (base.findXmlnsForPrefix( a.getXmlnsPrefix() ) == a) return a.getXmlnsPrefix(); // No exisiting xmlns I can use, need to create one. See if I can first if (!createIfMissing) return null; // Sanitize the suggestion. if (suggestion != null && (suggestion.length() == 0 || suggestion.toLowerCase().startsWith( "xml" ) || base.findXmlnsForPrefix( suggestion ) != null)) { suggestion = null; } // If no suggestion, make one up if (suggestion == null) { String prefixBase = QNameHelper.suggestPrefix( ns ); suggestion = prefixBase; for ( int i = 1 ; ; suggestion = prefixBase + i++ ) if (base.findXmlnsForPrefix( suggestion ) == null) break; } // Add a new namespace decl at the top elem if one exists, otherwise at root Xobj c = base; while ( !c.isRoot() && !c.ensureParent().isRoot() ) c = c._parent; base.setAttr( _locale.createXmlns( suggestion ), ns ); return suggestion; } final QName getValueAsQName ( ) { assert !hasChildren(); // TODO - // caching the QName value in this object would prevent one from having // to repeat all this string arithmatic over and over again. Perhaps // when I make the store capable of handling strong simple types this // can be done ... String value = getValueAsString( Locale.WS_COLLAPSE ); String prefix, localname; int firstcolon = value.indexOf( ':' ); if (firstcolon >= 0) { prefix = value.substring( 0, firstcolon ); localname = value.substring( firstcolon + 1 ); } else { prefix = ""; localname = value; } String uri = namespaceForPrefix( prefix, true ); if (uri == null) return null; // no prefix definition found - that's illegal return new QName( uri, localname ); } final Xobj getAttr ( QName name ) { for ( Xobj x = _firstChild ; x != null && x.isAttr() ; x = x._nextSibling ) if (x._name.equals( name )) return x; return null; } final QName getXsiTypeName ( ) { assert isContainer(); Xobj a = getAttr( Locale._xsiType ); return a == null ? null : a.getValueAsQName(); } final XmlObject getObject ( ) { return isUserNode() ? (XmlObject) getUser() : null; } final TypeStoreUser getUser ( ) { assert isUserNode(); assert _user != null || (!isRoot() && !isStableUser()); if (_user == null) { // BUGBUG - this is recursive TypeStoreUser parentUser = _parent == null ? ((TypeStoreUserFactory) XmlBeans.NO_TYPE).createTypeStoreUser() : _parent.getUser(); _user = isElem() ? parentUser.create_element_user( _name, getXsiTypeName() ) : parentUser.create_attribute_user( _name ); _user.attach_store( this ); } return _user; } final void invalidateUser ( ) { assert isValid(); assert _user == null || isUserNode(); if (_user != null) _user.invalidate_value(); } final void ensureOccupancy ( ) { assert isValid(); if (isVacant()) { assert isUserNode(); // In order to use Cur to set the value, I mark the // value as occupied and remove the user to prohibit // further user invalidations clearBit( VACANT ); TypeStoreUser user = _user; _user = null; String value = user.build_text( this ); long saveVersion = _locale._versionAll; long saveVersionSansText = _locale._versionSansText; setValue( value ); assert saveVersionSansText == _locale._versionSansText; _locale._versionAll = saveVersion; assert _user == null; _user = user; } } private void setValue(String val) { assert CharUtil.isValid(val, 0, val.length()); // Check for nothing to insert if (val.length() <= 0) return; _locale.notifyChange(); Xobj lastAttr = lastAttr(); int startPos = 1; Xobj charOwner = this; if (lastAttr != null) { charOwner = lastAttr; startPos = charOwner.posAfter(); } charOwner.insertCharsHelper(startPos, val, 0, val.length(), true); } // // TypeStore // public SchemaTypeLoader get_schematypeloader ( ) { return _locale._schemaTypeLoader; } public XmlLocale get_locale ( ) { return _locale; } // TODO - remove this when I've replaced the old store public Object get_root_object ( ) { return _locale; } public boolean is_attribute ( ) { assert isValid(); return isAttr(); } public boolean validate_on_set ( ) { assert isValid(); return _locale._validateOnSet; } public void invalidate_text ( ) { _locale.enter(); try { assert isValid(); if (isOccupied()) { if (hasTextNoEnsureOccupancy() || hasChildren()) { TypeStoreUser user = _user; _user = null; Cur c = tempCur(); c.moveNodeContents( null, false ); c.release(); assert _user == null; _user = user; } setBit( VACANT ); } assert isValid(); } finally { _locale.exit(); } } public String fetch_text ( int wsr ) { _locale.enter(); try { assert isValid() && isOccupied(); return getValueAsString( wsr ); } finally { _locale.exit(); } } public XmlCursor new_cursor ( ) { _locale.enter(); try { Cur c = tempCur(); XmlCursor xc = new Cursor( c ); c.release(); return xc; } finally { _locale.exit(); } } public SchemaField get_schema_field ( ) { assert isValid(); if (isRoot()) return null; TypeStoreUser parentUser = ensureParent().getUser(); if (isAttr()) return parentUser.get_attribute_field( _name ); assert isElem(); TypeStoreVisitor visitor = parentUser.new_visitor(); if (visitor == null) return null; for ( Xobj x = _parent._firstChild ; ; x = x._nextSibling ) { if (x.isElem()) { visitor.visit( x._name ); if (x == this) return visitor.get_schema_field(); } } } public void validate ( ValidatorListener eventSink ) { _locale.enter(); try { Cur c = tempCur(); Validate validate = new Validate( c, eventSink ); c.release(); } finally { _locale.exit(); } } public TypeStoreUser change_type ( SchemaType type ) { _locale.enter(); try { Cur c = tempCur(); c.setType( type, false ); c.release(); } finally { _locale.exit(); } return getUser(); } public TypeStoreUser substitute ( QName name, SchemaType type ) { _locale.enter(); try { Cur c = tempCur(); c.setSubstitution( name, type, false ); c.release(); } finally { _locale.exit(); } return getUser(); } public QName get_xsi_type ( ) { return getXsiTypeName(); } public void store_text ( String text ) { _locale.enter(); TypeStoreUser user = _user; _user = null; try { Cur c = tempCur(); c.moveNodeContents( null, false ); if (text != null && text.length() > 0) { c.next(); c.insertString( text ); } c.release(); } finally { assert _user == null; _user = user; _locale.exit(); } } public int compute_flags ( ) { if (isRoot()) return 0; TypeStoreUser parentUser = ensureParent().getUser(); if (isAttr()) return parentUser.get_attributeflags( _name ); int f = parentUser.get_elementflags( _name ); if (f != -1) return f; TypeStoreVisitor visitor = parentUser.new_visitor(); if (visitor == null) return 0; for ( Xobj x = _parent._firstChild ; ; x = x._nextSibling ) { if (x.isElem()) { visitor.visit( x._name ); if (x == this) return visitor.get_elementflags(); } } } public String compute_default_text ( ) { if (isRoot()) return null; TypeStoreUser parentUser = ensureParent().getUser(); if (isAttr()) return parentUser.get_default_attribute_text( _name ); String result = parentUser.get_default_element_text( _name ); if (result != null) return result; TypeStoreVisitor visitor = parentUser.new_visitor(); if (visitor == null) return null; for ( Xobj x = _parent._firstChild ; ; x = x._nextSibling ) { if (x.isElem()) { visitor.visit( x._name ); if (x == this) return visitor.get_default_text(); } } } public boolean find_nil ( ) { if (isAttr()) return false; _locale.enter(); try { Xobj a = getAttr( Locale._xsiNil ); if (a == null) return false; String value = a.getValueAsString( Locale.WS_COLLAPSE ); return value.equals( "true" ) || value.equals( "1" ); } finally { _locale.exit(); } } public void invalidate_nil ( ) { if (isAttr()) return; _locale.enter(); try { if (!_user.build_nil()) removeAttr( Locale._xsiNil ); else setAttr( Locale._xsiNil, "true" ); } finally { _locale.exit(); } } public int count_elements ( QName name ) { return _locale.count( this, name, null ); } public int count_elements ( QNameSet names ) { return _locale.count( this, null, names ); } public TypeStoreUser find_element_user ( QName name, int i ) { for ( Xobj x = _firstChild ; x != null ; x = x._nextSibling ) if (x.isElem() && x._name.equals( name ) && --i < 0) return x.getUser(); return null; } public TypeStoreUser find_element_user ( QNameSet names, int i ) { for ( Xobj x = _firstChild ; x != null ; x = x._nextSibling ) if (x.isElem() && names.contains( x._name ) && --i < 0) return x.getUser(); return null; } public void find_all_element_users ( QName name, List fillMeUp ) { for ( Xobj x = _firstChild ; x != null ; x = x._nextSibling ) if (x.isElem() && x._name.equals( name )) fillMeUp.add( x.getUser() ); } public void find_all_element_users ( QNameSet names, List fillMeUp ) { for ( Xobj x = _firstChild ; x != null ; x = x._nextSibling ) if (x.isElem() && names.contains( x._name )) fillMeUp.add( x.getUser() ); } private static TypeStoreUser insertElement ( QName name, Xobj x, int pos ) { x._locale.enter(); try { Cur c = x._locale.tempCur(); c.moveTo( x, pos ); c.createElement( name ); TypeStoreUser user = c.getUser(); c.release(); return user; } finally { x._locale.exit(); } } public TypeStoreUser insert_element_user ( QName name, int i ) { if (i < 0) throw new IndexOutOfBoundsException(); if (!isContainer()) throw new IllegalStateException(); Xobj x = _locale.findNthChildElem( this, name, null, i ); if (x == null) { if (i > _locale.count( this, name, null ) + 1) throw new IndexOutOfBoundsException(); return add_element_user( name ); } return insertElement( name, x, 0 ); } public TypeStoreUser insert_element_user ( QNameSet names, QName name, int i ) { if (i < 0) throw new IndexOutOfBoundsException(); if (!isContainer()) throw new IllegalStateException(); Xobj x = _locale.findNthChildElem( this, null, names, i ); if (x == null) { if (i > _locale.count( this, null, names ) + 1) throw new IndexOutOfBoundsException(); return add_element_user( name ); } return insertElement( name, x, 0 ); } public TypeStoreUser add_element_user ( QName name ) { if (!isContainer()) throw new IllegalStateException(); QNameSet endSet = null; boolean gotEndSet = false; Xobj candidate = null; for ( Xobj x = _lastChild ; x != null ; x = x._prevSibling ) { if (x.isContainer()) { if (x._name.equals( name )) break; if (!gotEndSet) { endSet = _user.get_element_ending_delimiters( name ); gotEndSet = true; } if (endSet == null || endSet.contains( x._name )) candidate = x; } } return candidate == null ? insertElement( name, this, END_POS ) : insertElement( name, candidate, 0 ); } private static void removeElement ( Xobj x ) { if (x == null) throw new IndexOutOfBoundsException(); x._locale.enter(); try { Cur c = x.tempCur(); c.moveNode( null ); c.release(); } finally { x._locale.exit(); } } public void remove_element ( QName name, int i ) { if (i < 0) throw new IndexOutOfBoundsException(); if (!isContainer()) throw new IllegalStateException(); Xobj x; for ( x = _firstChild ; x != null ; x = x._nextSibling ) if (x.isElem() && x._name.equals( name ) && --i < 0) break; removeElement( x ); } public void remove_element ( QNameSet names, int i ) { if (i < 0) throw new IndexOutOfBoundsException(); if (!isContainer()) throw new IllegalStateException(); Xobj x; for ( x = _firstChild ; x != null ; x = x._nextSibling ) if (x.isElem() && names.contains( x._name ) && --i < 0) break; removeElement( x ); } public TypeStoreUser find_attribute_user ( QName name ) { Xobj a = getAttr( name ); return a == null ? null : a.getUser(); } public TypeStoreUser add_attribute_user ( QName name ) { if (getAttr( name ) != null) throw new IndexOutOfBoundsException(); _locale.enter(); try { return setAttr( name, "" ).getUser(); } finally { _locale.exit(); } } public void remove_attribute ( QName name ) { _locale.enter(); try { if (!removeAttr( name )) throw new IndexOutOfBoundsException(); } finally { _locale.exit(); } } public TypeStoreUser copy_contents_from ( TypeStore source ) { Xobj xSrc = (Xobj) source; if (xSrc == this) return getUser(); _locale.enter(); try { xSrc._locale.enter(); Cur c = tempCur(); try { Cur cSrc1 = xSrc.tempCur(); Map sourceNamespaces = Locale.getAllNamespaces( cSrc1, null ); cSrc1.release(); if (isAttr()) { Cur cSrc = xSrc.tempCur(); String value = Locale.getTextValue( cSrc ); cSrc.release(); c.setValue( value ); } else { // Here I save away the user of this node so that it does not get whacked // in the following operations. disconnectChildrenUsers(); assert !inhibitDisconnect(); setBit( INHIBIT_DISCONNECT ); QName xsiType = isContainer() ? getXsiTypeName() : null; Xobj copy = xSrc.copyNode( _locale ); Cur.moveNodeContents( this, null, true ); c.next(); Cur.moveNodeContents( copy, c, true ); c.moveTo( this ); if (xsiType != null) c.setXsiType( xsiType ); assert inhibitDisconnect(); clearBit( INHIBIT_DISCONNECT ); } if (sourceNamespaces != null) { if (!c.isContainer()) c.toParent(); Locale.applyNamespaces( c, sourceNamespaces ); } } finally { c.release(); xSrc._locale.exit(); } } finally { _locale.exit(); } return getUser(); } public TypeStoreUser copy(SchemaTypeLoader stl, SchemaType type, XmlOptions options) { //do not use a user's Factory method for copying. //XmlFactoryHook hook = XmlFactoryHook.ThreadContext.getHook(); Xobj destination = null; options = XmlOptions.maskNull(options); SchemaType sType = (SchemaType) options.get(XmlOptions.DOCUMENT_TYPE); if (sType == null) sType = type == null ? XmlObject.type : type; Locale locale = this.locale(); if ( Boolean.TRUE.equals(options.get(XmlOptions.COPY_USE_NEW_SYNC_DOMAIN)) ) locale = Locale.getLocale(stl, options); if (sType.isDocumentType() || (sType.isNoType() && (this instanceof Xobj.DocumentXobj))) destination = Cur.createDomDocumentRootXobj(locale, false); else destination = Cur.createDomDocumentRootXobj(locale, true); locale.enter(); try { Cur c = destination.tempCur(); c.setType(type); c.release(); } finally { locale.exit(); } TypeStoreUser tsu = destination.copy_contents_from(this); return tsu; } public void array_setter ( XmlObject[] sources, QName elementName ) { _locale.enter(); try { // TODO - this is the quick and dirty implementation, make this faster int m = sources.length; ArrayList copies = new ArrayList(); ArrayList types = new ArrayList(); for ( int i = 0 ; i < m ; i++ ) { // TODO - deal with null sources[ i ] here -- what to do? if (sources[ i ] == null) throw new IllegalArgumentException( "Array element null" ); else if (sources[ i ].isImmutable()) { copies.add( null ); types.add( null ); } else { Xobj x = ((Xobj) ((TypeStoreUser) sources[ i ]).get_store()); if (x._locale == _locale) copies.add( x.copyNode( _locale ) ); else { x._locale.enter(); try { copies.add( x.copyNode( _locale ) ); } finally { x._locale.exit(); } } types.add( sources[ i ].schemaType() ); } } int n = count_elements( elementName ); for ( ; n > m ; n-- ) remove_element( elementName, m ); for ( ; m > n ; n++ ) add_element_user( elementName ); assert m == n; ArrayList elements = new ArrayList(); find_all_element_users( elementName, elements ); for ( int i = 0 ; i < elements.size() ; i++ ) elements.set( i, (Xobj) ((TypeStoreUser) elements.get( i )).get_store() ); assert elements.size() == n; Cur c = tempCur(); for ( int i = 0 ; i < n ; i++ ) { Xobj x = (Xobj) elements.get( i ); if (sources[ i ].isImmutable()) x.getObject().set( sources[ i ] ); else { Cur.moveNodeContents( x, null, true ); c.moveTo( x ); c.next(); Cur.moveNodeContents( (Xobj) copies.get( i ), c, true ); x.change_type( (SchemaType) types.get( i ) ); } } c.release(); } finally { _locale.exit(); } } public void visit_elements ( TypeStoreVisitor visitor ) { throw new RuntimeException( "Not implemeneted" ); } public XmlObject[] exec_query ( String queryExpr, XmlOptions options ) throws XmlException { _locale.enter(); try { Cur c = tempCur(); XmlObject[] result = Query.objectExecQuery( c, queryExpr, options ); c.release(); return result; } finally { _locale.exit(); } } public String find_prefix_for_nsuri ( String nsuri, String suggested_prefix ) { _locale.enter(); try { return prefixForNamespace( nsuri, suggested_prefix, true ); } finally { _locale.exit(); } } public String getNamespaceForPrefix ( String prefix ) { return namespaceForPrefix( prefix, true ); } // // // abstract static class NodeXobj extends Xobj implements Dom, Node, NodeList { NodeXobj ( Locale l, int kind, int domType ) { super( l, kind, domType ); } Dom getDom ( ) { return this; } // // // public int getLength ( ) { return DomImpl._childNodes_getLength( this ); } public Node item ( int i ) { return DomImpl._childNodes_item( this, i ); } public Node appendChild ( Node newChild ) { return DomImpl._node_appendChild( this, newChild ); } public Node cloneNode ( boolean deep ) { return DomImpl._node_cloneNode( this, deep ); } public NamedNodeMap getAttributes ( ) { return null; } public NodeList getChildNodes ( ) { return this; } public Node getParentNode ( ) { return DomImpl._node_getParentNode( this ); } public Node removeChild ( Node oldChild ) { return DomImpl._node_removeChild( this, oldChild ); } public Node getFirstChild ( ) { return DomImpl._node_getFirstChild( this ); } public Node getLastChild ( ) { return DomImpl._node_getLastChild( this ); } public String getLocalName ( ) { return DomImpl._node_getLocalName( this ); } public String getNamespaceURI ( ) { return DomImpl._node_getNamespaceURI( this ); } public Node getNextSibling ( ) { return DomImpl._node_getNextSibling( this ); } public String getNodeName ( ) { return DomImpl._node_getNodeName( this ); } public short getNodeType ( ) { return DomImpl._node_getNodeType( this ); } public String getNodeValue ( ) { return DomImpl._node_getNodeValue( this ); } public Document getOwnerDocument ( ) { return DomImpl._node_getOwnerDocument( this ); } public String getPrefix ( ) { return DomImpl._node_getPrefix( this ); } public Node getPreviousSibling ( ) { return DomImpl._node_getPreviousSibling( this ); } public boolean hasAttributes ( ) { return DomImpl._node_hasAttributes( this ); } public boolean hasChildNodes ( ) { return DomImpl._node_hasChildNodes( this ); } public Node insertBefore ( Node newChild, Node refChild ) { return DomImpl._node_insertBefore( this, newChild, refChild ); } public boolean isSupported ( String feature, String version ) { return DomImpl._node_isSupported( this, feature, version ); } public void normalize ( ) { DomImpl._node_normalize( this ); } public Node replaceChild ( Node newChild, Node oldChild ) { return DomImpl._node_replaceChild( this, newChild, oldChild ); } public void setNodeValue ( String nodeValue ) { DomImpl._node_setNodeValue( this, nodeValue ); } public void setPrefix ( String prefix ) { DomImpl._node_setPrefix( this, prefix ); } public boolean nodeCanHavePrefixUri( ){ return false; } // DOM Level 3 public Object getUserData ( String key ) { return DomImpl._node_getUserData( this, key ); } public Object setUserData ( String key, Object data, UserDataHandler handler ) { return DomImpl._node_setUserData( this, key, data, handler ); } public Object getFeature ( String feature, String version ) { return DomImpl._node_getFeature( this, feature, version ); } public boolean isEqualNode ( Node arg ) { return DomImpl._node_isEqualNode( this, arg ); } public boolean isSameNode ( Node arg ) { return DomImpl._node_isSameNode( this, arg ); } public String lookupNamespaceURI ( String prefix ) { return DomImpl._node_lookupNamespaceURI( this, prefix ); } public String lookupPrefix ( String namespaceURI ) { return DomImpl._node_lookupPrefix( this, namespaceURI ); } public boolean isDefaultNamespace ( String namespaceURI ) { return DomImpl._node_isDefaultNamespace( this, namespaceURI ); } public void setTextContent ( String textContent ) { DomImpl._node_setTextContent( this, textContent ); } public String getTextContent ( ) { return DomImpl._node_getTextContent( this ); } public short compareDocumentPosition ( Node other ) { return DomImpl._node_compareDocumentPosition( this, other ); } public String getBaseURI ( ) { return DomImpl._node_getBaseURI( this ); } } static class DocumentXobj extends NodeXobj implements Document { DocumentXobj ( Locale l ) { super( l, ROOT, DomImpl.DOCUMENT ); } Xobj newNode ( Locale l ) { return new DocumentXobj( l ); } // // // public Attr createAttribute ( String name ) { return DomImpl._document_createAttribute( this, name ); } public Attr createAttributeNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createAttributeNS( this, namespaceURI, qualifiedName ); } public CDATASection createCDATASection ( String data ) { return DomImpl._document_createCDATASection( this, data ); } public Comment createComment ( String data ) { return DomImpl._document_createComment( this, data ); } public DocumentFragment createDocumentFragment ( ) { return DomImpl._document_createDocumentFragment( this ); } public Element createElement ( String tagName ) { return DomImpl._document_createElement( this, tagName ); } public Element createElementNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createElementNS( this, namespaceURI, qualifiedName ); } public EntityReference createEntityReference ( String name ) { return DomImpl._document_createEntityReference( this, name ); } public ProcessingInstruction createProcessingInstruction ( String target, String data ) { return DomImpl._document_createProcessingInstruction( this, target, data ); } public Text createTextNode ( String data ) { return DomImpl._document_createTextNode( this, data ); } public DocumentType getDoctype ( ) { return DomImpl._document_getDoctype( this ); } public Element getDocumentElement ( ) { return DomImpl._document_getDocumentElement( this ); } public Element getElementById ( String elementId ) { if ( _idToElement == null )return null; Xobj o = (Xobj) _idToElement.get(elementId); if (o == null) return null; if (!isInSameTree(o)) { _idToElement.remove(elementId); } return (Element)o; } public NodeList getElementsByTagName ( String tagname ) { return DomImpl._document_getElementsByTagName( this, tagname ); } public NodeList getElementsByTagNameNS ( String namespaceURI, String localName ) { return DomImpl._document_getElementsByTagNameNS( this, namespaceURI, localName ); } public DOMImplementation getImplementation ( ) { return DomImpl._document_getImplementation( this ); } public Node importNode ( Node importedNode, boolean deep ) { return DomImpl._document_importNode( this, importedNode, deep ); } // DOM Level 3 public Node adoptNode ( Node source ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getDocumentURI ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public DOMConfiguration getDomConfig ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getInputEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public boolean getStrictErrorChecking ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getXmlEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public boolean getXmlStandalone ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getXmlVersion ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void normalizeDocument ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public Node renameNode ( Node n, String namespaceURI, String qualifiedName ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setDocumentURI ( String documentURI ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setStrictErrorChecking ( boolean strictErrorChecking ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setXmlStandalone ( boolean xmlStandalone ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setXmlVersion ( String xmlVersion ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } protected void addIdElement( String idVal, Dom e){ if ( _idToElement == null) _idToElement = new java.util.Hashtable(); _idToElement.put(idVal,e); } void removeIdElement( String idVal ){ if (_idToElement != null) _idToElement.remove(idVal); } private java.util.Hashtable _idToElement; } static class DocumentFragXobj extends NodeXobj implements DocumentFragment { DocumentFragXobj ( Locale l ) { super( l, ROOT, DomImpl.DOCFRAG ); } Xobj newNode ( Locale l ) { return new DocumentFragXobj( l ); } } final static class ElementAttributes implements NamedNodeMap { ElementAttributes ( ElementXobj elementXobj ) { _elementXobj = elementXobj; } public int getLength ( ) { return DomImpl._attributes_getLength( _elementXobj ); } public Node getNamedItem ( String name ) { return DomImpl._attributes_getNamedItem ( _elementXobj, name ); } public Node getNamedItemNS ( String namespaceURI, String localName ) { return DomImpl._attributes_getNamedItemNS ( _elementXobj, namespaceURI, localName ); } public Node item ( int index ) { return DomImpl._attributes_item ( _elementXobj, index ); } public Node removeNamedItem ( String name ) { return DomImpl._attributes_removeNamedItem ( _elementXobj, name ); } public Node removeNamedItemNS ( String namespaceURI, String localName ) { return DomImpl._attributes_removeNamedItemNS ( _elementXobj, namespaceURI, localName ); } public Node setNamedItem ( Node arg ) { return DomImpl._attributes_setNamedItem ( _elementXobj, arg ); } public Node setNamedItemNS ( Node arg ) { return DomImpl._attributes_setNamedItemNS ( _elementXobj, arg ); } private ElementXobj _elementXobj; } static abstract class NamedNodeXobj extends NodeXobj { NamedNodeXobj ( Locale l, int kind, int domType ) { super( l, kind, domType ); _canHavePrefixUri = true; } public boolean nodeCanHavePrefixUri( ){ return _canHavePrefixUri; } boolean _canHavePrefixUri; } static class ElementXobj extends NamedNodeXobj implements Element { ElementXobj ( Locale l, QName name ) { super( l, ELEM, DomImpl.ELEMENT ); _name = name; } Xobj newNode ( Locale l ) { return new ElementXobj( l, _name ); } // // // public NamedNodeMap getAttributes ( ) { if (_attributes == null) _attributes = new ElementAttributes( this ); return _attributes; } public String getAttribute ( String name ) { return DomImpl._element_getAttribute( this, name ); } public Attr getAttributeNode ( String name ) { return DomImpl._element_getAttributeNode( this, name ); } public Attr getAttributeNodeNS ( String namespaceURI, String localName ) { return DomImpl._element_getAttributeNodeNS( this, namespaceURI, localName ); } public String getAttributeNS ( String namespaceURI, String localName ) { return DomImpl._element_getAttributeNS( this, namespaceURI, localName ); } public NodeList getElementsByTagName ( String name ) { return DomImpl._element_getElementsByTagName( this, name ); } public NodeList getElementsByTagNameNS ( String namespaceURI, String localName ) { return DomImpl._element_getElementsByTagNameNS( this, namespaceURI, localName ); } public String getTagName ( ) { return DomImpl._element_getTagName( this ); } public boolean hasAttribute ( String name ) { return DomImpl._element_hasAttribute( this, name ); } public boolean hasAttributeNS ( String namespaceURI, String localName ) { return DomImpl._element_hasAttributeNS( this, namespaceURI, localName ); } public void removeAttribute ( String name ) { DomImpl._element_removeAttribute( this, name ); } public Attr removeAttributeNode ( Attr oldAttr ) { return DomImpl._element_removeAttributeNode( this, oldAttr ); } public void removeAttributeNS ( String namespaceURI, String localName ) { DomImpl._element_removeAttributeNS( this, namespaceURI, localName ); } public void setAttribute ( String name, String value ) { DomImpl._element_setAttribute( this, name, value ); } public Attr setAttributeNode ( Attr newAttr ) { return DomImpl._element_setAttributeNode( this, newAttr ); } public Attr setAttributeNodeNS ( Attr newAttr ) { return DomImpl._element_setAttributeNodeNS( this, newAttr ); } public void setAttributeNS ( String namespaceURI, String qualifiedName, String value ) { DomImpl._element_setAttributeNS( this, namespaceURI, qualifiedName, value ); } // DOM Level 3 public TypeInfo getSchemaTypeInfo ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setIdAttribute ( String name, boolean isId ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setIdAttributeNS ( String namespaceURI, String localName, boolean isId ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setIdAttributeNode ( Attr idAttr, boolean isId ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } private ElementAttributes _attributes; } static class AttrXobj extends NamedNodeXobj implements Attr { AttrXobj ( Locale l, QName name ) { super( l, ATTR, DomImpl.ATTR ); _name = name; } Xobj newNode ( Locale l ) { return new AttrXobj( l, _name ); } // public Node getNextSibling ( ) { return null; } // public String getName ( ) { return DomImpl._node_getNodeName( this ); } public Element getOwnerElement ( ) { return DomImpl._attr_getOwnerElement( this ); } public boolean getSpecified ( ) { return DomImpl._attr_getSpecified( this ); } public String getValue ( ) { return DomImpl._node_getNodeValue( this ); } public void setValue ( String value ) { DomImpl._node_setNodeValue( this, value ); } // DOM Level 3 public TypeInfo getSchemaTypeInfo ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public boolean isId ( ) { return false; } } static class AttrIdXobj extends AttrXobj { AttrIdXobj ( Locale l, QName name ) { super( l, name ); } public boolean isId() { return true; } } static class CommentXobj extends NodeXobj implements Comment { CommentXobj ( Locale l ) { super( l, COMMENT, DomImpl.COMMENT ); } Xobj newNode ( Locale l ) { return new CommentXobj( l ); } public NodeList getChildNodes ( ) { return DomImpl._emptyNodeList; } public void appendData ( String arg ) { DomImpl._characterData_appendData( this, arg ); } public void deleteData ( int offset, int count ) { DomImpl._characterData_deleteData( this, offset, count ); } public String getData ( ) { return DomImpl._characterData_getData( this ); } public int getLength ( ) { return DomImpl._characterData_getLength( this ); } public Node getFirstChild ( ) { return null; } public void insertData ( int offset, String arg ) { DomImpl._characterData_insertData( this, offset, arg ); } public void replaceData ( int offset, int count, String arg ) { DomImpl._characterData_replaceData( this, offset, count, arg ); } public void setData ( String data ) { DomImpl._characterData_setData( this, data ); } public String substringData ( int offset, int count ) { return DomImpl._characterData_substringData( this, offset, count ); } } static class ProcInstXobj extends NodeXobj implements ProcessingInstruction { ProcInstXobj ( Locale l, String target ) { super( l, PROCINST, DomImpl.PROCINST ); _name = _locale.makeQName( null, target ); } Xobj newNode ( Locale l ) { return new ProcInstXobj( l, _name.getLocalPart() ); } public int getLength ( ) { return 0; } public Node getFirstChild ( ) { return null; } public String getData ( ) { return DomImpl._processingInstruction_getData( this ); } public String getTarget ( ) { return DomImpl._processingInstruction_getTarget( this ); } public void setData ( String data ) { DomImpl._processingInstruction_setData( this, data ); } } // // SAAJ objects // static class SoapPartDocXobj extends DocumentXobj { SoapPartDocXobj ( Locale l ) { super(l); //super( l, ROOT, DomImpl.DOCUMENT ); _soapPartDom = new SoapPartDom( this ); } Dom getDom ( ) { return _soapPartDom; } Xobj newNode ( Locale l ) { return new SoapPartDocXobj( l ); } SoapPartDom _soapPartDom; } static class SoapPartDom extends SOAPPart implements Dom, Document, NodeList { SoapPartDom ( SoapPartDocXobj docXobj ) { _docXobj = docXobj; } public int nodeType ( ) { return DomImpl.DOCUMENT; } public Locale locale ( ) { return _docXobj._locale; } public Cur tempCur ( ) { return _docXobj.tempCur(); } public QName getQName ( ) { return _docXobj._name; } public void dump ( ) { dump( System.out ); } public void dump ( PrintStream o ) { _docXobj.dump( o ); } public void dump ( PrintStream o, Object ref ) { _docXobj.dump( o, ref ); } public String name ( ) { return "#document"; } public Node appendChild ( Node newChild ) { return DomImpl._node_appendChild( this, newChild ); } public Node cloneNode ( boolean deep ) { return DomImpl._node_cloneNode( this, deep ); } public NamedNodeMap getAttributes ( ) { return null; } public NodeList getChildNodes ( ) { return this; } public Node getParentNode ( ) { return DomImpl._node_getParentNode( this ); } public Node removeChild ( Node oldChild ) { return DomImpl._node_removeChild( this, oldChild ); } public Node getFirstChild ( ) { return DomImpl._node_getFirstChild( this ); } public Node getLastChild ( ) { return DomImpl._node_getLastChild( this ); } public String getLocalName ( ) { return DomImpl._node_getLocalName( this ); } public String getNamespaceURI ( ) { return DomImpl._node_getNamespaceURI( this ); } public Node getNextSibling ( ) { return DomImpl._node_getNextSibling( this ); } public String getNodeName ( ) { return DomImpl._node_getNodeName( this ); } public short getNodeType ( ) { return DomImpl._node_getNodeType( this ); } public String getNodeValue ( ) { return DomImpl._node_getNodeValue( this ); } public Document getOwnerDocument ( ) { return DomImpl._node_getOwnerDocument( this ); } public String getPrefix ( ) { return DomImpl._node_getPrefix( this ); } public Node getPreviousSibling ( ) { return DomImpl._node_getPreviousSibling( this ); } public boolean hasAttributes ( ) { return DomImpl._node_hasAttributes( this ); } public boolean hasChildNodes ( ) { return DomImpl._node_hasChildNodes( this ); } public Node insertBefore ( Node newChild, Node refChild ) { return DomImpl._node_insertBefore( this, newChild, refChild ); } public boolean isSupported ( String feature, String version ) { return DomImpl._node_isSupported( this, feature, version ); } public void normalize ( ) { DomImpl._node_normalize( this ); } public Node replaceChild ( Node newChild, Node oldChild ) { return DomImpl._node_replaceChild( this, newChild, oldChild ); } public void setNodeValue ( String nodeValue ) { DomImpl._node_setNodeValue( this, nodeValue ); } public void setPrefix ( String prefix ) { DomImpl._node_setPrefix( this, prefix ); } // DOM Level 3 public Object getUserData ( String key ) { return DomImpl._node_getUserData( this, key ); } public Object setUserData ( String key, Object data, UserDataHandler handler ) { return DomImpl._node_setUserData( this, key, data, handler ); } public Object getFeature ( String feature, String version ) { return DomImpl._node_getFeature( this, feature, version ); } public boolean isEqualNode ( Node arg ) { return DomImpl._node_isEqualNode( this, arg ); } public boolean isSameNode ( Node arg ) { return DomImpl._node_isSameNode( this, arg ); } public String lookupNamespaceURI ( String prefix ) { return DomImpl._node_lookupNamespaceURI( this, prefix ); } public String lookupPrefix ( String namespaceURI ) { return DomImpl._node_lookupPrefix( this, namespaceURI ); } public boolean isDefaultNamespace ( String namespaceURI ) { return DomImpl._node_isDefaultNamespace( this, namespaceURI ); } public void setTextContent ( String textContent ) { DomImpl._node_setTextContent( this, textContent ); } public String getTextContent ( ) { return DomImpl._node_getTextContent( this ); } public short compareDocumentPosition ( Node other ) { return DomImpl._node_compareDocumentPosition( this, other ); } public String getBaseURI ( ) { return DomImpl._node_getBaseURI( this ); } public Node adoptNode ( Node source ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getDocumentURI ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public DOMConfiguration getDomConfig ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getInputEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public boolean getStrictErrorChecking ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getXmlEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public boolean getXmlStandalone ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public String getXmlVersion ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void normalizeDocument ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public Node renameNode ( Node n, String namespaceURI, String qualifiedName ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setDocumentURI ( String documentURI ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setStrictErrorChecking ( boolean strictErrorChecking ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setXmlStandalone ( boolean xmlStandalone ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public void setXmlVersion ( String xmlVersion ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); } public Attr createAttribute ( String name ) { return DomImpl._document_createAttribute( this, name ); } public Attr createAttributeNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createAttributeNS( this, namespaceURI, qualifiedName ); } public CDATASection createCDATASection ( String data ) { return DomImpl._document_createCDATASection( this, data ); } public Comment createComment ( String data ) { return DomImpl._document_createComment( this, data ); } public DocumentFragment createDocumentFragment ( ) { return DomImpl._document_createDocumentFragment( this ); } public Element createElement ( String tagName ) { return DomImpl._document_createElement( this, tagName ); } public Element createElementNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createElementNS( this, namespaceURI, qualifiedName ); } public EntityReference createEntityReference ( String name ) { return DomImpl._document_createEntityReference( this, name ); } public ProcessingInstruction createProcessingInstruction ( String target, String data ) { return DomImpl._document_createProcessingInstruction( this, target, data ); } public Text createTextNode ( String data ) { return DomImpl._document_createTextNode( this, data ); } public DocumentType getDoctype ( ) { return DomImpl._document_getDoctype( this ); } public Element getDocumentElement ( ) { return DomImpl._document_getDocumentElement( this ); } public Element getElementById ( String elementId ) { return DomImpl._document_getElementById( this, elementId ); } public NodeList getElementsByTagName ( String tagname ) { return DomImpl._document_getElementsByTagName( this, tagname ); } public NodeList getElementsByTagNameNS ( String namespaceURI, String localName ) { return DomImpl._document_getElementsByTagNameNS( this, namespaceURI, localName ); } public DOMImplementation getImplementation ( ) { return DomImpl._document_getImplementation( this ); } public Node importNode ( Node importedNode, boolean deep ) { return DomImpl._document_importNode( this, importedNode, deep ); } public int getLength ( ) { return DomImpl._childNodes_getLength( this ); } public Node item ( int i ) { return DomImpl._childNodes_item( this, i ); } public void removeAllMimeHeaders ( ) { DomImpl._soapPart_removeAllMimeHeaders( this ); } public void removeMimeHeader ( String name ) { DomImpl._soapPart_removeMimeHeader( this, name ); } public Iterator getAllMimeHeaders ( ) { return DomImpl._soapPart_getAllMimeHeaders( this ); } public SOAPEnvelope getEnvelope ( ) { return DomImpl._soapPart_getEnvelope( this ); } public Source getContent ( ) { return DomImpl._soapPart_getContent( this ); } public void setContent ( Source source ) { DomImpl._soapPart_setContent( this, source ); } public String[] getMimeHeader ( String name ) { return DomImpl._soapPart_getMimeHeader( this, name ); } public void addMimeHeader ( String name, String value ) { DomImpl._soapPart_addMimeHeader( this, name,value ); } public void setMimeHeader ( String name, String value ) { DomImpl._soapPart_setMimeHeader( this, name, value ); } public Iterator getMatchingMimeHeaders ( String[] names ) { return DomImpl._soapPart_getMatchingMimeHeaders( this, names ); } public Iterator getNonMatchingMimeHeaders ( String[] names ) { return DomImpl._soapPart_getNonMatchingMimeHeaders( this, names ); } public boolean nodeCanHavePrefixUri( ){ return true; } SoapPartDocXobj _docXobj; } static class SoapElementXobj extends ElementXobj implements SOAPElement, org.apache.xmlbeans.impl.soap.Node { SoapElementXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapElementXobj( l, _name ); } public void detachNode ( ) { DomImpl._soapNode_detachNode( this ); } public void recycleNode ( ) { DomImpl._soapNode_recycleNode( this ); } public String getValue ( ) { return DomImpl._soapNode_getValue( this ); } public void setValue ( String value ) { DomImpl._soapNode_setValue( this, value ); } public SOAPElement getParentElement ( ) { return DomImpl._soapNode_getParentElement( this ); } public void setParentElement ( SOAPElement p ) { DomImpl._soapNode_setParentElement( this, p ); } public void removeContents ( ) { DomImpl._soapElement_removeContents( this ); } public String getEncodingStyle ( ) { return DomImpl._soapElement_getEncodingStyle( this ); } public void setEncodingStyle ( String encodingStyle ) { DomImpl._soapElement_setEncodingStyle( this, encodingStyle ); } public boolean removeNamespaceDeclaration ( String prefix ) { return DomImpl._soapElement_removeNamespaceDeclaration( this, prefix ); } public Iterator getAllAttributes ( ) { return DomImpl._soapElement_getAllAttributes( this ); } public Iterator getChildElements ( ) { return DomImpl._soapElement_getChildElements( this ); } public Iterator getNamespacePrefixes ( ) { return DomImpl._soapElement_getNamespacePrefixes( this ); } public SOAPElement addAttribute ( Name name, String value ) throws SOAPException { return DomImpl._soapElement_addAttribute( this, name, value ); } public SOAPElement addChildElement ( SOAPElement oldChild ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, oldChild ); } public SOAPElement addChildElement ( Name name ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, name ); } public SOAPElement addChildElement ( String localName ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, localName ); } public SOAPElement addChildElement ( String localName, String prefix ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, localName, prefix ); } public SOAPElement addChildElement ( String localName, String prefix, String uri ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, localName, prefix, uri ); } public SOAPElement addNamespaceDeclaration ( String prefix, String uri ) { return DomImpl._soapElement_addNamespaceDeclaration( this, prefix, uri ); } public SOAPElement addTextNode ( String data ) { return DomImpl._soapElement_addTextNode( this, data ); } public String getAttributeValue ( Name name ) { return DomImpl._soapElement_getAttributeValue( this, name ); } public Iterator getChildElements ( Name name ) { return DomImpl._soapElement_getChildElements( this, name ); } public Name getElementName ( ) { return DomImpl._soapElement_getElementName( this ); } public String getNamespaceURI ( String prefix ) { return DomImpl._soapElement_getNamespaceURI( this, prefix ); } public Iterator getVisibleNamespacePrefixes ( ) { return DomImpl._soapElement_getVisibleNamespacePrefixes( this ); } public boolean removeAttribute ( Name name ) { return DomImpl._soapElement_removeAttribute( this, name ); } } static class SoapBodyXobj extends SoapElementXobj implements SOAPBody { SoapBodyXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapBodyXobj( l, _name ); } public boolean hasFault ( ) { return DomImpl.soapBody_hasFault( this ); } public SOAPFault addFault ( ) throws SOAPException { return DomImpl.soapBody_addFault( this ); } public SOAPFault getFault ( ) { return DomImpl.soapBody_getFault( this ); } public SOAPBodyElement addBodyElement ( Name name ) { return DomImpl.soapBody_addBodyElement( this, name ); } public SOAPBodyElement addDocument ( Document document ) { return DomImpl.soapBody_addDocument( this, document ); } public SOAPFault addFault ( Name name, String s ) throws SOAPException { return DomImpl.soapBody_addFault( this, name, s ); } public SOAPFault addFault ( Name faultCode, String faultString, java.util.Locale locale ) throws SOAPException { return DomImpl.soapBody_addFault( this, faultCode, faultString, locale ); } } static class SoapBodyElementXobj extends SoapElementXobj implements SOAPBodyElement { SoapBodyElementXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapBodyElementXobj( l, _name ); } } static class SoapEnvelopeXobj extends SoapElementXobj implements SOAPEnvelope { SoapEnvelopeXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapEnvelopeXobj( l, _name ); } public SOAPBody addBody ( ) throws SOAPException { return DomImpl._soapEnvelope_addBody( this ); } public SOAPBody getBody ( ) throws SOAPException { return DomImpl._soapEnvelope_getBody( this ); } public SOAPHeader getHeader ( ) throws SOAPException { return DomImpl._soapEnvelope_getHeader( this ); } public SOAPHeader addHeader ( ) throws SOAPException { return DomImpl._soapEnvelope_addHeader( this ); } public Name createName ( String localName ) { return DomImpl._soapEnvelope_createName( this, localName ); } public Name createName ( String localName, String prefix, String namespaceURI ) { return DomImpl._soapEnvelope_createName( this, localName, prefix, namespaceURI ); } } static class SoapHeaderXobj extends SoapElementXobj implements SOAPHeader { SoapHeaderXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapHeaderXobj( l, _name ); } public Iterator examineAllHeaderElements ( ) { return DomImpl.soapHeader_examineAllHeaderElements( this ); } public Iterator extractAllHeaderElements ( ) { return DomImpl.soapHeader_extractAllHeaderElements( this ); } public Iterator examineHeaderElements ( String actor ) { return DomImpl.soapHeader_examineHeaderElements( this, actor ); } public Iterator examineMustUnderstandHeaderElements ( String mustUnderstandString ) { return DomImpl.soapHeader_examineMustUnderstandHeaderElements( this, mustUnderstandString ); } public Iterator extractHeaderElements ( String actor ) { return DomImpl.soapHeader_extractHeaderElements( this, actor ); } public SOAPHeaderElement addHeaderElement ( Name name ) { return DomImpl.soapHeader_addHeaderElement( this, name ); } } static class SoapHeaderElementXobj extends SoapElementXobj implements SOAPHeaderElement { SoapHeaderElementXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapHeaderElementXobj( l, _name ); } public void setMustUnderstand ( boolean mustUnderstand ) { DomImpl.soapHeaderElement_setMustUnderstand( this, mustUnderstand ); } public boolean getMustUnderstand ( ) { return DomImpl.soapHeaderElement_getMustUnderstand( this ); } public void setActor ( String actor ) { DomImpl.soapHeaderElement_setActor( this, actor ); } public String getActor ( ) { return DomImpl.soapHeaderElement_getActor( this ); } } static class SoapFaultXobj extends SoapBodyElementXobj implements SOAPFault { SoapFaultXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapFaultXobj( l, _name ); } public void setFaultString ( String faultString ) { DomImpl.soapFault_setFaultString( this, faultString ); } public void setFaultString ( String faultString, java.util.Locale locale ) { DomImpl.soapFault_setFaultString( this, faultString, locale ); } public void setFaultCode ( Name faultCodeName ) throws SOAPException { DomImpl.soapFault_setFaultCode( this, faultCodeName ); } public void setFaultActor ( String faultActorString ) { DomImpl.soapFault_setFaultActor( this, faultActorString ); } public String getFaultActor ( ) { return DomImpl.soapFault_getFaultActor( this ); } public String getFaultCode ( ) { return DomImpl.soapFault_getFaultCode( this ); } public void setFaultCode ( String faultCode ) throws SOAPException { DomImpl.soapFault_setFaultCode( this, faultCode ); } public java.util.Locale getFaultStringLocale ( ) { return DomImpl.soapFault_getFaultStringLocale( this ); } public Name getFaultCodeAsName ( ) { return DomImpl.soapFault_getFaultCodeAsName( this ); } public String getFaultString ( ) { return DomImpl.soapFault_getFaultString( this ); } public Detail addDetail ( ) throws SOAPException { return DomImpl.soapFault_addDetail( this ); } public Detail getDetail ( ) { return DomImpl.soapFault_getDetail( this ); } } static class SoapFaultElementXobj extends SoapElementXobj implements SOAPFaultElement { SoapFaultElementXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new SoapFaultElementXobj( l, _name ); } } static class DetailXobj extends SoapFaultElementXobj implements Detail { DetailXobj ( Locale l, QName name ) { super( l, name ); } Xobj newNode ( Locale l ) { return new DetailXobj( l, _name ); } public DetailEntry addDetailEntry ( Name name ) { return DomImpl.detail_addDetailEntry( this, name ); } public Iterator getDetailEntries ( ) { return DomImpl.detail_getDetailEntries( this ); } } static class DetailEntryXobj extends SoapElementXobj implements DetailEntry { Xobj newNode ( Locale l ) { return new DetailEntryXobj( l, _name ); } DetailEntryXobj ( Locale l, QName name ) { super( l, name ); } } // // // static class Bookmark implements XmlMark { boolean isOnList ( Bookmark head ) { for ( ; head != null ; head = head._next ) if (head == this) return true; return false; } Bookmark listInsert ( Bookmark head ) { assert _next == null && _prev == null; if (head == null) head = _prev = this; else { _prev = head._prev; head._prev = head._prev._next = this; } return head; } Bookmark listRemove ( Bookmark head ) { assert _prev != null && isOnList( head ); if (_prev == this) head = null; else { if (head == this) head = _next; else _prev._next = _next; if (_next == null) head._prev = _prev; else { _next._prev = _prev; _next = null; } } _prev = null; assert _next == null; return head; } void moveTo ( Xobj x, int p ) { assert isOnList( _xobj._bookmarks ); if (_xobj != x) { _xobj._bookmarks = listRemove( _xobj._bookmarks ); x._bookmarks = listInsert( x._bookmarks ); _xobj = x; } _pos = p; } // // XmlCursor.XmlMark method // public XmlCursor createCursor ( ) { if (_xobj == null) { throw new IllegalStateException( "Attempting to create a cursor on a bookmark that " + "has been cleared or replaced."); } return Cursor.newCursor( _xobj, _pos ); } // // // Xobj _xobj; int _pos; Bookmark _next; Bookmark _prev; Object _key; Object _value; } // // // Locale _locale; QName _name; Cur _embedded; Bookmark _bookmarks; int _bits; Xobj _parent; Xobj _nextSibling; Xobj _prevSibling; Xobj _firstChild; Xobj _lastChild; Object _srcValue, _srcAfter; int _offValue, _offAfter; int _cchValue, _cchAfter; // TODO - put this in a ptr off this node CharNode _charNodesValue; CharNode _charNodesAfter; // TODO - put this in a ptr off this node TypeStoreUser _user; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy