blob: 67b1d6c4102d432f1a5c041dabf7e9c4c6c8afed [file] [log] [blame]
/* 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.w3c.dom.CharacterData;
import org.w3c.dom.*;
import javax.xml.namespace.QName;
import java.io.PrintStream;
abstract class CharNode implements DomImpl.Dom, Node, CharacterData {
public CharNode(Locale l) {
assert l != null;
_locale = l;
}
public QName getQName() {
return null;
}
public Locale locale() {
assert isValid();
return _locale == null ? ((DomImpl.Dom) _src).locale() : _locale;
}
public void setChars(Object src, int off, int cch) {
assert CharUtil.isValid(src, off, cch);
assert (_locale != null || _src instanceof DomImpl.Dom);
if (_locale == null) {
_locale = ((DomImpl.Dom) _src).locale();
}
_src = src;
_off = off;
_cch = cch;
}
public DomImpl.Dom getDom() {
assert isValid();
if (_src instanceof DomImpl.Dom)
return (DomImpl.Dom) _src;
return null;
}
public void setDom(DomImpl.Dom d) {
assert d != null;
_src = d;
_locale = null;
}
public Cur tempCur() {
assert isValid();
if (!(_src instanceof DomImpl.Dom))
return null;
Cur c = locale().tempCur();
c.moveToCharNode(this);
return c;
}
private boolean isValid() {
return (_src instanceof DomImpl.Dom) == (_locale == null);
}
public static boolean isOnList(CharNode nodes, CharNode node) {
assert node != null;
for (CharNode cn = nodes; cn != null; cn = cn._next) {
if (cn == node) {
return true;
}
}
return false;
}
public static CharNode remove(CharNode nodes, CharNode node) {
assert isOnList(nodes, node);
if (nodes == node) {
nodes = node._next;
} else {
node._prev._next = node._next;
}
if (node._next != null) {
node._next._prev = node._prev;
}
node._prev = node._next = null;
return nodes;
}
public static CharNode insertNode(CharNode nodes, CharNode newNode, CharNode before) {
assert !isOnList(nodes, newNode);
assert before == null || isOnList(nodes, before);
assert newNode != null;
assert newNode._prev == null && newNode._next == null;
if (nodes == null) {
assert before == null;
nodes = newNode;
} else if (nodes == before) {
nodes._prev = newNode;
newNode._next = nodes;
nodes = newNode;
} else {
CharNode n = nodes;
while (n._next != before)
n = n._next;
if ((newNode._next = n._next) != null)
n._next._prev = newNode;
newNode._prev = n;
n._next = newNode;
}
return nodes;
}
public static CharNode appendNode(CharNode nodes, CharNode newNode) {
return insertNode(nodes, newNode, null);
}
public static CharNode appendNodes(CharNode nodes, CharNode newNodes) {
assert newNodes != null;
assert newNodes._prev == null;
if (nodes == null)
return newNodes;
CharNode n = nodes;
while (n._next != null)
n = n._next;
n._next = newNodes;
newNodes._prev = n;
return nodes;
}
public static CharNode copyNodes(CharNode nodes, Object newSrc) {
CharNode newNodes = null;
for (CharNode n = null; nodes != null; nodes = nodes._next) {
CharNode newNode;
if (nodes instanceof TextNode)
newNode = nodes.locale().createTextNode();
else
newNode = nodes.locale().createCdataNode();
// How to deal with entity refs??
newNode.setChars(newSrc, nodes._off, nodes._cch);
if (newNodes == null)
newNodes = newNode;
if (n != null) {
n._next = newNode;
newNode._prev = n;
}
n = newNode;
}
return newNodes;
}
public boolean nodeCanHavePrefixUri() {
return false;
}
public boolean isNodeAftertext() {
assert _src instanceof Xobj :
"this method is to only be used for nodes backed up by Xobjs";
Xobj src = (Xobj) _src;
return src._charNodesValue == null ? true :
src._charNodesAfter == null ? false :
CharNode.isOnList(src._charNodesAfter, this);
}
public void dump(PrintStream o, Object ref) {
if (_src instanceof DomImpl.Dom)
((DomImpl.Dom) _src).dump(o, ref);
else
o.println("Lonely CharNode: \"" + CharUtil.getString(_src, _off, _cch) + "\"");
}
public void dump(PrintStream o) {
dump(o, (Object) this);
}
public void dump() {
dump(System.out);
}
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 DomImpl._emptyNodeList;
}
public Node getParentNode() {
return DomImpl._node_getParentNode(this);
}
public Node removeChild(Node oldChild) {
return DomImpl._node_removeChild(this, oldChild);
}
public Node getFirstChild() {
return null;
}
public Node getLastChild() {
return null;
}
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 false;
}
public boolean hasChildNodes() {
return false;
}
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 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 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);
}
Object getObject() {
return _src;
}
private Locale _locale;
CharNode _next;
CharNode _prev;
private Object _src;
int _off;
int _cch;
}